package com.hqyj.javaSpringBoot.modules.common.controller;

import com.hqyj.javaSpringBoot.modules.common.entiy.ImageType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

/**
 * 将ImageType作为公用的接口数据返回json对象
 */
@RestController
@RequestMapping("/api")
public class DictionaryController {

    /**
     * 通过反射机制获取ImageType.class
     * 为什么运用反射？反射运用场景？
     * Java 中编译类型有两种
     * 静态编译：在编译时确定类型；
     * 动态编译：运行时确定类型，最大限度地发挥了 Java 的灵活性；
     * 反射这种东西，确实破坏了封装的初衷，但反射可以把很多难以预测的问题留到运行时，
     * 动态地去考虑去解决，这也就使得我们在走投无路时，还可以有一道后门开着让我们大摇大摆地进入；
     * JDBC 连接：在运行时通过读取配置文件获取数据驱动类名，反射加载数据库驱动；
     */

    private static Map<String,Class> enumMap=new HashMap<String,Class>(){{
        put("imageType", ImageType.class);
    }};

    /**
     * 127.0.0.1/api/dictionary/{name}
     * name表示的put("imageType", ImageType.class)的imageType
     * 将这两个属性值作为json对象返回给接口
     * @param name
     * @return
     */
    @GetMapping("/dictionary/{name}")
    public List<Object> getEnum(@PathVariable String name){
        /*MAP使用containsKey和containsValue方法,
        验证键值对是否存在此KEY或VAL值。*/
            try {
                if (enumMap.containsKey(name)){
                Class clazz = enumMap.get(name);
                //java 反射机制之 getDeclaredMethod（）获取方法，
                // 然后invoke执行实例对应的方法
                    Method method = clazz.getDeclaredMethod("values");
                //静态方法可省略对象，直接用null替代
                    Object[] objects = (Object[])method.invoke(null);
                    return Arrays.asList(objects);
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        return null;
    }
}
